# -*- coding: utf-8 -*-
# 引入依赖包
# pip3 install alibabacloud_facebody20191230
# face.py

import os
import io
from urllib.request import urlopen
# 导入阿里云人脸识别服务客户端和请求模型
from alibabacloud_facebody20191230.client import Client
from alibabacloud_facebody20191230.models import SearchFaceAdvanceRequest
# 导入阿里云基础配置和服务运行时选项
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions

# 配置阿里云服务访问参数
config = Config(
    # 创建AccessKey ID和AccessKey Secret， 请参考https://help.aliyun.com/document_detail/175144.html。
    # 如果您用的是RAM用户的AccessKey， 还需要为RAM用户授予权限AliyunVIAPIFullAccess， 
    #请参考https://help.aliyun.com/document_detail/145025.html。
    # 从环境变量读取配置的AccessKey ID和AccessKey Secret。 运行代码示例前必须先配置环境变量。
    # 配置阿里云服务访问参数
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 访问的域名
    endpoint='facebody.cn-shanghai.aliyuncs.com',
    # 访问的域名对应的region
    region_id='cn-shanghai'
)

def alibaba_face():
    """
    使用阿里云人脸识别服务进行人脸搜索和匹配
    
    功能：
    1. 读取本地拍摄的人脸图片
    2. 调用阿里云人脸识别API进行人脸搜索
    3. 返回匹配度最高的分数
    
    返回值：
    float: 人脸匹配相似度分数(0.0-1.0), 0.0表示无匹配或识别失败
    """

    # 创建人脸搜索请求对象
    search_face_request = SearchFaceAdvanceRequest()

    #场景一： 读取本地文件作为搜索目标
    #打开之前拍摄并保存的人脸图片文件
    stream0 = open(r'/tmp/SearchFace.jpg', 'rb')
    #将图片文件对象赋值请求参数
    search_face_request.image_url_object = stream0

    #场景二： 使用任意可访问的url
    #url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace1.png'
    #img = urlopen(url).read()
    #search_face_request.image_url_object = io.BytesIO(img)

    # 设置人脸数据库名称和返回结果数量限制
    search_face_request.db_name = 'default' #使用默认的人脸数据库
    search_face_request.limit = 5       #最多返回5个匹配结果

    # 创建运行时选项
    runtime_option = RuntimeOptions()

    try:
        # 初始化Client 发起人脸搜索请求
        client = Client(config)     #创建阿里云人脸识别客户端
        # 调用搜索人脸的高级接口
        response = client.search_face_advance(search_face_request, runtime_option)

        # 解析响应结果，提取匹配列表
        match_list = response.body.to_map()['Data']['MatchList']

        # 提取所有匹配项的相似度分数
        scores = [item['Score'] for item in match_list[0]['FaceItems']]
        
        # 获取最高的相似度分数并四舍五入到两位小数
        highest_score = max(scores)
        value = round(highest_score, 2)
        return value    #返回最高匹配分数

    except Exception as error:
        # 异常处理：打印错误信息
        print(error)
        # 打印错误代码
        print(error.code)
        return 0.0  #发送异常时返回0.0表示识别失败
        # tips: 可通过error.__dict__查看属性名称

    finally:
        #关闭流，释放文件资源
        stream0.close()

#程序入口点
if __name__ == "__main__":
    alibaba_face()  #调用人脸识别函数
    # score = alibaba_face()
    # print(f"最高人脸匹配相似度分数：{socre}")

